草庐IT

c++ - Clang、std::next、libstdc++ 和 constexpr-ness

全部标签

c++ - 获取 std::future<T>::wait_for 的运行时间

有没有一种简单的方法来获取std::future::wait_for期间耗时?如果没有超时发生?我想实现这样的目标:std::futurefutureRet=std::async(std::launch::async,&Someone::doSomething,this);futureRet.wait_for(std::chrono::seconds(30));coutseconds.";是否有一种“getElapsedTime()”函数,还是我必须自己计算耗时? 最佳答案 有一个简单的方法使用:autostart=std::chr

c++ - std::span.size() 与数组/vector 大小

我们在工作中使用std::span()(目前使用gsl实现)。最近我们发现将std::span.size()与vector.size()进行比较会产生-Wsign-compare错误:if(span.size()>vector.size())//comparisonbetweensignedandunsignedintegerexpressions[-Wsign-compare]我认为我们不想对这些比较中的每一个进行转换。我们的编码指南将这些警告视为错误。想知道是否有人有任何想法或建议? 最佳答案 您可以使用迭代器并同时使用函数st

c++ - 什么时候 std::shared_timed_mutex 比 std::mutex 慢,什么时候(不)使用它?

我正在尝试使用this在C++中实现多线程LRU缓存文章作为提示或灵感。它适用于Go,但所需的概念或多或少也存在于C++中。本文建议在散列表和链表周围使用带有共享互斥锁的细粒度锁定。所以我打算用std::unordered_map写一个缓存,std::list并使用std::shared_timed_mutex锁定.我的用例包括几个线程(4-8)使用此缓存作为拼写错误的单词和相应可能的更正的存储。缓存的大小约为10000-100000个项目。但是我在几个地方读到,使用共享互斥锁而不是普通互斥锁几乎没有意义,而且速度更慢,尽管我找不到一些带有数字的真实基准或至少在何时使用和何时不使用的模

c++ - 哪些 clang-tidy 检查提供自动修复?

我想找出哪些clang-tidy检查可以使用-fix选项运行,即自动生成固定代码。我知道所有的modernize-*检查都可以做到这一点,其他一些检查也可以(比如google-readability-casting),但我没有找到完整的列表。某处有list吗?或者除了阅读每张支票的来源之外还有其他方法可以找出答案? 最佳答案 编辑:自clang-tidy10起,修复选项包含在documentation.的检查列表中。我的其余答案对版本9及更低版本仍然有效。grep--include=\*.cpp-rc'./'-e"FixItHint

c++ - 隐式转换产生 "error: taking address of temporary"(GCC vs clang)

在试验强类型整数时,我遇到了一个来自GCC8.2的奇怪错误:error:takingaddressoftemporary我可以想象上述错误有意义的典型场景,但在我的情况下我没有遇到问题。重现错误的缩小(人为)示例如下:#include#includeenumclassEnum:std::size_t{};structPod{std::size_tval;constexproperatorEnum()const{returnstatic_cast(val);}};templateconstexprvoidfoo(){usingFoo=std::integral_constant;//[G

c++ - noexcept 访问 std::variant

对于某些标准库类,访问其部分内容可能会合法地失败。通常,您可以在一些可能引发异常的方法和标记为noexcept的方法之间进行选择。后者省去了前提条件的检查,所以如果你想自己承担责任,你可以。这可以在不允许使用异常或修复性能瓶颈的情况下使用。示例1:std::vector元素访问:std::vectorvec;vec.at(n)//throwsstd::out_of_rangevec[n]//potentiallyUB,thusyourownresponsibility示例2:std::optional访问:std::optionaloptn;optn.value()//throwsst

c++ - 理解 std::fmod 和 std::remainder

有人可以解释一下函数的功能吗std::fmod和std::remainder工作。在std::fmod的情况下,有人可以解释步骤以说明如何:std::fmod(+5.1,+3.0)=2.1std::remainder也是如此,它会产生负面结果。std::remainder(+5.1,+3.0)=-0.9std::remainder(-5.1,+3.0)=0.9 最佳答案 作为std::fmod的引用状态:除法运算的浮点余数x/y这个函数计算出的值恰好是x-n*y,其中n是x/y小数部分被截断。返回值具有相同的符号x并且小于y在幅度上

c++ - std::string 的转换运算符无法处理赋值

我正在使用代理类型来推迟工作,直到将结果分配给一个变量,它通过在代理类型上使用转换运算符来工作。为std::string添加转换运算符重载时,它适用于从代理构建字符串,但无法编译赋值,并显示以下错误消息:error:ambiguousoverloadfor'operator='虽然这个问题与operatorT()notusedinassignment的问题类似,这里的解决方案不适用,因为我也在使用模板化转换运算符。下面是片段:#include#includestructProxy{templateoperatorT(){Tres;std::cerr如何使这个代理与字符串赋值一起工作?

c++ - MSVC 无法识别带有模板自动参数的 constexpr 函数

我试图为值列表中的值创建一个索引元查找器。这是代码:#include#includetemplatestructValueTplList;templateconstexprintMetaFindV(intind){//notfoundcasereturn-1;}templateconstexprintMetaFindV(intind=0){ifconstexpr(std::is_same_v){returnNeedleV==V?ind:MetaFindV(ind+1);}else{returnMetaFindV(ind+1);}}//maintemplatestructMetaInde

c++ - gcc 与 clang : expanding a captured parameter pack twice

考虑这个代码片段:intmain(){autofirst=[&](auto...one){autofaulty=[&](){[[maybe_unused]]autoi=(one+...);return(one+...);};faulty();};first(1);}另见ongodbolt.似乎当我尝试在内部lambda中将隐式捕获的参数包one扩展两次时,gcc会提示,但clang不会。请注意,当我明确捕获时,例如[&one...],gcc不再提示。对我来说,这看起来像是一个gcc错误,但我想得到比我更有经验的人的一些确认,因为我已经在带有可变捕获的clang中看到(不同的)错误行为h